#include "main.h"

const uint32_t INTMAX=100000;
const char separator[40]= "=======================================";

int main(int argc, const char *argv[])
{        
	uint32_t numVer,numDef,graphType,isAllI;
	int32_t start,end;
	string graphTypeS,algorithm;
	bool isAll;
	//defaults
	numVer=numDef=isAllI=INTMAX;
	isAllI=1;
	isAll=false;
	graphTypeS="x";
	algorithm="x";
	//end defaults
	dsr::Argument_helper ah;
	ah.set_author("Edho Prima Arief <me@myconan.net>");
	ah.set_description("Calculates deficiency for various graphs.");
	ah.set_build_date("2009");
	ah.set_name("defical");
	ah.set_version("0.1");
	ah.new_named_unsigned_int('n',"numver","","Number of vertices.",numVer);
	ah.new_named_unsigned_int('d',"numdef","","Number of deficiencies.",numDef);
	ah.new_named_string('g',"graph","","Type of graph.",graphTypeS);
	ah.new_named_string('a',"algorithm","","Choice of algorithm.",algorithm);
	ah.new_named_unsigned_int('c',"complete","","Don't stop on found.",isAllI);
	ah.process(argc,argv);
	if(isAllI==1)
		isAll=true;
	if(graphTypeS=="wheel")
		graphType=3;
	else if(graphTypeS=="fan")
		graphType=4;
	else if(graphTypeS=="doublefan")
		graphType=5;
	else
	{
		printf("Invalid graph type. Accepted: wheel, fan, doublefan.\n");
		return 1;
	}
	if(numVer<5 || numVer>=INTMAX)
	{
		printf("Number of vertices must be more than 5 (or less than %d).\n",INTMAX);
		return 1;
	}
	if(numDef>=INTMAX)
	{
		printf("Ha ha ha funny. Just give up (number of deficiencies must be less than %d.\n",INTMAX);
		return 1;
	}
	if(algorithm!="backtrack")
	{
		printf("Invalid algorithm specified.\n");
		return 1;
	}
	printf("%s", separator);
	printf("\nNumber of vertices: %d\n",numVer);
	printf("Number of deficiencies: %d\n",numDef);
	cout << "Graph type: " << graphTypeS << endl;
	cout << "Algorithm: " << algorithm << endl;
	cout << separator << endl;
	gettime *mytime=new gettime();
	cout << "[I] " << mytime->time_v << ": Started" << endl;
	cout << separator << endl;
	if(algorithm=="backtrack")
	{
		start=1;
		end=(numVer+numDef+1)/2;
		bool isFinished=false;
#ifdef _OPENMP
#pragma omp parallel for num_threads(3)
#endif
		for(int32_t i=start;i<=end;i++){
			if(!isFinished){
				bt::backtrack *bt1=new bt::backtrack(graphType,numVer,numDef,i,isAll);
				bt1->Walk();
				if(!isFinished)
				{
					if(bt1->IsSemt)
					{
						if(!isAll)
							isFinished=true;
						gettime *mytime=new gettime();
						printf("[F] %s: Found\n%s\n%s%s\n",mytime->time_v,separator,bt1->Result.c_str(),separator);
						bt1->IsSemt=false;
					}
					else { 
						if(!isFinished) 
						{
							gettime *mytime=new gettime();
							printf("[N] %s: Unable to construct with first label %d\n",mytime->time_v,i);
						}
					}
				}
			}
		}
	}
	return 0;
}
